package DAOS;

import java.io.Serializable;
import java.util.List;

/*
 *DESARROLLADO POR: MARIA ALEJANDRA PEREZ SALAZAR
 * 					 DIEGO FERNANDO COLORADO BELTRAN
 * 
 * INGENIEROS DE SISTEMAS Y COMPUTACION
 * INTELIGENCIA DE NEGOCIOS INFORMATICOS  
 * 
 * 
 * 
 */

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public abstract class Dao<Entidad, Llave extends Serializable> {

	@PersistenceContext(unitName = "servicios.sanitarios.esacor")
	protected EntityManager entityManager;

	protected abstract Class<Entidad> getEntityClass();

	/**
	 * METODO PARA LA INSERCION EN LA BASE DE DATOS
	 * 
	 * @param entidad
	 *            : RECIBE LA ENTIDAD A SER INSERTADA EN LA BASE DE DATOS.
	 */
	public void insert(Entidad entidad) {
		entityManager.persist(entidad);

	}

	/**
	 * METODO PARA LA ACTUALIZACION DE DATOS EN LA BASE DE DATOS.
	 * 
	 * @param entidad
	 *            : RECIBE LA ENTIDAD A SER ACTUALIZADA EN LA BASE DE DATOS.
	 */
	public void update(Entidad entidad) {
		entityManager.merge(entidad);

	}

	/**
	 * METODO PARA LA ELIMINACION DE DATOS EN LA BASE DE DATOS.
	 * 
	 * @param entidad
	 *            : RECIBE LA ENTIDAD A SER ELIMINADA EN LA BASE DE DATOS.
	 */
	public void remove(Entidad entidad) {
		entityManager.remove(entidad);

	}

	/**
	 * METODO PARA LA BUSQUEDA DE DATOS EN LA BASE DE DATOS.
	 * 
	 * @param llave
	 *            : RECIBE EL ID DE LA ENTIDAD PARA SER BUSCADA EN LA BASE DE
	 *            DATOS
	 * 
	 * @return entidad
	 */
	public Entidad findByKey(Llave llave) {
		return entityManager.find(getEntityClass(), llave);
	}

	/**
	 * METODO QUE PERMITE OBTEBER UN LISTADO CON TODOS LOS REGISTROS DE UNA
	 * DETERMINADA ENTIDAD
	 * 
	 */

	public List<Entidad> getAll() {
		return entityManager.createQuery(
				"select entidad from " + getEntityClass().getSimpleName()
						+ " entidad ", getEntityClass()).getResultList();
	}

}
